{"componentChunkName":"component---src-templates-blog-post-js","path":"/Building-a-Task-Management-App-in-React/","result":{"data":{"site":{"siteMetadata":{"title":"Aleks Popovic - personal website and blog"}},"markdownRemark":{"id":"1f063c58-f88d-575a-a1db-119bea7f5d8a","excerpt":"Can you become more productive by making a productivity app? Not sure about that, but you can definitely become more productive by building new projects and a…","html":"<p>Can you become more productive by making a productivity app? Not sure about that, but you can definitely become more productive by building new projects and a task management app has been on my mind for a long time now. I decided to build it in React without using any additional plugins except node-sass which allows you to use .scss files in your project.</p>\n<p>If you prefer a video version of this tutorial you can watch me build a task management app on Youtube:</p>\n<div class=\"gatsby-resp-iframe-wrapper\" style=\"padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem\" > <iframe src=\"https://www.youtube.com/embed/BdCCpAICXVc\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen style=\" position: absolute; top: 0; left: 0; width: 100%; height: 100%; \"></iframe> </div>\n<p>I started a new React app by running create-react-app command in my working folder.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">create-react-app task-management</code></pre></div>\n<p>For this project I will focus more on the React part of the code, but there will be a SandBox link to a full code example that includes the CSS files as well. I mainly used flexbox to center elements, and that’s pretty much 80% of the CSS used. The rest is adding custom colors and margins for separation between elements.</p>\n<p>To start off - I removed all unnecessary code from App.js and I imported the StatusLine component, which we will use to sort out our tasks based on their status. I added it three times alongside an h1 heading, and I also added function skeletons that we will be implementing later.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/App.scss\"</span>\n<span class=\"token keyword\">import</span> StatusLine <span class=\"token keyword\">from</span> <span class=\"token string\">\"./StatusLine\"</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>tasks<span class=\"token punctuation\">,</span> setTasks<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">addEmptyTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">status</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">addTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">taskToAdd</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">deleteTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">taskId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">moveTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> newStatus</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">saveTasksToLocalStorage</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">tasks</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">loadTasksFromLocalStorage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>App<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Task Management</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>main</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>section</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">StatusLine</span></span>\n            <span class=\"token attr-name\">tasks</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>tasks<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">addEmptyTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>addEmptyTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">addTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>addTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">deleteTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>deleteTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">moveTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>moveTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">status</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Backlog<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">StatusLine</span></span>\n            <span class=\"token attr-name\">tasks</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>tasks<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">addEmptyTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>addEmptyTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">addTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>addTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">deleteTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>deleteTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">moveTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>moveTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">status</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>In Progress<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">StatusLine</span></span>\n            <span class=\"token attr-name\">tasks</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>tasks<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">addEmptyTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>addEmptyTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">addTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>addTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">deleteTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>deleteTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">moveTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>moveTask<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">status</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Done<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>section</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>main</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App</code></pre></div>\n<p>We are passing in all of our task manipulation functions into the StatusLine components because we need to pass them into each individual Task component. We are also adding a status property which will be used to determine task’s initial status and to also set up some headings.</p>\n<p>Our tasks are going to be stored in an array of objects by using the useState hook. We also imported the useEffect hook because we will use it later to save and load our task data from the browser’s localStorage.</p>\n<p>Let’s start implementing those functions.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">addEmptyTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">status</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> lastTask <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">[</span>tasks<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n\n  <span class=\"token keyword\">let</span> newTaskId <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>lastTask <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    newTaskId <span class=\"token operator\">=</span> lastTask<span class=\"token punctuation\">.</span>id <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">setTasks</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">tasks</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">[</span>\n    <span class=\"token operator\">...</span>tasks<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      id<span class=\"token operator\">:</span> newTaskId<span class=\"token punctuation\">,</span>\n      title<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      description<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      urgency<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      status<span class=\"token operator\">:</span> status<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We are going to use addEmptyTask() when we start adding a new task, so we just want to set it to the first available ID and leave all other properties empty, except for the status which we will pass into the function from the Task component. If we have no tasks we set the ID to 1 by default. After that we are free to set our state by merging the new empty task object with the existing array of tasks from our state.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">addTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">taskToAdd</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> filteredTasks <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> task<span class=\"token punctuation\">.</span>id <span class=\"token operator\">!==</span> taskToAdd<span class=\"token punctuation\">.</span>id\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">let</span> newTaskList <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>filteredTasks<span class=\"token punctuation\">,</span> taskToAdd<span class=\"token punctuation\">]</span>\n\n  <span class=\"token function\">setTasks</span><span class=\"token punctuation\">(</span>newTaskList<span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">saveTasksToLocalStorage</span><span class=\"token punctuation\">(</span>newTaskList<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>When we enter all of our task properties we want to save it to our state. But, before that, we want to remove the empty task with the same ID, so we filter our tasks array. After that we merge the new task with the rest of the list and we save everything to local storage (we implement this function later).</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">deleteTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">taskId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> filteredTasks <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> task<span class=\"token punctuation\">.</span>id <span class=\"token operator\">!==</span> taskId\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">setTasks</span><span class=\"token punctuation\">(</span>filteredTasks<span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">saveTasksToLocalStorage</span><span class=\"token punctuation\">(</span>filteredTasks<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Deleting a task is as simple as filtering our tasks array just the way we did it for adding a new task. After that we once again set our state again and save everything in the local storage.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">moveTask</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> newStatus</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> task <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> task<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> id\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n\n  <span class=\"token keyword\">let</span> filteredTasks <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> task<span class=\"token punctuation\">.</span>id <span class=\"token operator\">!==</span> id\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  task<span class=\"token punctuation\">.</span>status <span class=\"token operator\">=</span> newStatus\n\n  <span class=\"token keyword\">let</span> newTaskList <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>filteredTasks<span class=\"token punctuation\">,</span> task<span class=\"token punctuation\">]</span>\n\n  <span class=\"token function\">setTasks</span><span class=\"token punctuation\">(</span>newTaskList<span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">saveTasksToLocalStorage</span><span class=\"token punctuation\">(</span>newTaskList<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Our moveTask function is going to be used to move a task from one status to the next, or previous one. We filter our tasks list to search for the task that needs to be moved and to remove it from the state so we can change its status. After changing the tasks status we once again merge it back into the state and save everything to local storage.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">saveTasksToLocalStorage</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">tasks</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"tasks\"</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Local storage supports only storing string values, but our tasks are stored as an array of objects. To get around this restriction we need to use JSON.stringify to transform our data into a string. After that we call the setItem function which will store our tasks.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">loadTasksFromLocalStorage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> loadedTasks <span class=\"token operator\">=</span> localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">getItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"tasks\"</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">let</span> tasks <span class=\"token operator\">=</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">parse</span><span class=\"token punctuation\">(</span>loadedTasks<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTasks</span><span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>To retrieve our data from the local storage we need to revert our data from a string to an array of objects. For that we use JSON.parse function and then we are free to set our state. In order to call this function only once we need to implement the useEffect hook.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">loadTasksFromLocalStorage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>We call our function and as a second parameter inside useEffect we pass in an empty array. The second parameter is used to prevent useEffect from triggering on every render. By giving it an array of properties to watch we will activate useEffect only when those properties change. But, if we pass in an empty array the useEffect will trigger only once, on the first page load, and that is exactly what we want.</p>\n<p>With all functions implemented we are ready to move on to the StatusLine component.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/statusLine.scss\"</span>\n<span class=\"token keyword\">import</span> Task <span class=\"token keyword\">from</span> <span class=\"token string\">\"./Task\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">StatusLine</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> status<span class=\"token punctuation\">,</span> tasks<span class=\"token punctuation\">,</span> addTask<span class=\"token punctuation\">,</span> deleteTask<span class=\"token punctuation\">,</span> addEmptyTask<span class=\"token punctuation\">,</span> moveTask <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> props\n\n  <span class=\"token keyword\">let</span> taskList<span class=\"token punctuation\">,</span> tasksForStatus\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">handleAddEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">addEmptyTask</span><span class=\"token punctuation\">(</span>status<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    tasksForStatus <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> task<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> status\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>tasksForStatus<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    taskList <span class=\"token operator\">=</span> tasksForStatus<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Task</span></span>\n          <span class=\"token attr-name\">addTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=></span> <span class=\"token function\">addTask</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">deleteTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token parameter\">id</span> <span class=\"token operator\">=></span> <span class=\"token function\">deleteTask</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">moveTask</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> status</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">moveTask</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">task</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>task<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span>\n      <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>statusLine<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h3</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>status<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h3</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>taskList<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleAddEmpty<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>button addTask<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        +\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It may look like there is a lot happening here, but there really isn’t. We are picking up all of the props that we passed in from the App component. We use the status prop to filter the task array and display only tasks with that status. If we have tasks in our state we map them into Task components into which we pass in our functions for adding, deleting and moving a task, and also the task data itself. We handle adding an empty task with a simple button with an onClick event.</p>\n<p>Now we need to set up our Task component and we are done!</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/task.scss\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Task</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> addTask<span class=\"token punctuation\">,</span> deleteTask<span class=\"token punctuation\">,</span> moveTask<span class=\"token punctuation\">,</span> task <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> props\n\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>urgencyLevel<span class=\"token punctuation\">,</span> setUrgencyLevel<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>urgency<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>collapsed<span class=\"token punctuation\">,</span> setCollapsed<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>isCollapsed<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>formAction<span class=\"token punctuation\">,</span> setFormAction<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">setUrgency</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setUrgencyLevel</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span>urgency<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">handleSubmit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">handleMoveLeft</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">handleMoveRight</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do stuff</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">task </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>collapsed <span class=\"token operator\">?</span> <span class=\"token string\">\"collapsedTask\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleMoveLeft<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>button moveTask<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        &amp;#171;\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>collapsed <span class=\"token operator\">?</span> <span class=\"token string\">\"collapsed\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>title input<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>title<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Enter Title<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">disabled</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>collapsed<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">defaultValue</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>task<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>textarea</span>\n          <span class=\"token attr-name\">rows</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>2<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>description input<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>description<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Enter Description<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">defaultValue</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>task<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>urgencyLabels<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">low </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>urgencyLevel <span class=\"token operator\">===</span> <span class=\"token string\">\"low\"</span> <span class=\"token operator\">?</span> <span class=\"token string\">\"selected\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n              <span class=\"token attr-name\">urgency</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>low<span class=\"token punctuation\">\"</span></span>\n              <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>setUrgency<span class=\"token punctuation\">}</span></span>\n              <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>radio<span class=\"token punctuation\">\"</span></span>\n              <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>urgency<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n            low\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span>\n            <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">medium </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>urgencyLevel <span class=\"token operator\">===</span> <span class=\"token string\">\"medium\"</span> <span class=\"token operator\">?</span> <span class=\"token string\">\"selected\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n              <span class=\"token attr-name\">urgency</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>medium<span class=\"token punctuation\">\"</span></span>\n              <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>setUrgency<span class=\"token punctuation\">}</span></span>\n              <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>radio<span class=\"token punctuation\">\"</span></span>\n              <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>urgency<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n            medium\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span>\n            <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">high </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>urgencyLevel <span class=\"token operator\">===</span> <span class=\"token string\">\"high\"</span> <span class=\"token operator\">?</span> <span class=\"token string\">\"selected\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n              <span class=\"token attr-name\">urgency</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>high<span class=\"token punctuation\">\"</span></span>\n              <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>setUrgency<span class=\"token punctuation\">}</span></span>\n              <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>radio<span class=\"token punctuation\">\"</span></span>\n              <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>urgency<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n            high\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n          <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">setFormAction</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"save\"</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>button<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>collapsed <span class=\"token operator\">?</span> <span class=\"token string\">\"Edit\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Save\"</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token punctuation\">{</span>collapsed <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n            <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n              <span class=\"token function\">setFormAction</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"delete\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>button delete<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            X\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleMoveRight<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>button moveTask<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        &amp;#187;\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We have a couple of interesting things happening here. We have two buttons which we will use to call the moveTask function and switch the task’s status.</p>\n<p>We also have a form with input fields for task’s title and description. There is also the urgencyLabels container which is a group of radio buttons for switching the task’s status. Getting the checked radio button’s value is a bit tricky in react, so we will handle the urgency through state, but everything else we can submit as a form field.</p>\n<p>I have set up some helper classes - “collapsed”, “collapsedTask” and “selected”. I wanted to collapse tasks when they get saved and loaded from storage, so the screen doesn’t get too cluttered. This is handled with the isCollapsed property that each new task will have, and everything else is done through CSS. If a task has isCollapsed = true, my CSS takes care of collapsing everything except for the title, urgency and control buttons. We also reveal a delete button which you can use to get rid of a task completely.</p>\n<p>We are also reusing the Save button to edit an already created task. Since we have two buttons in a form we need to handle our form’s onSubmit event.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">handleSubmit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>formAction <span class=\"token operator\">===</span> <span class=\"token string\">\"save\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>collapsed<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setCollapsed</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> newTask <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        id<span class=\"token operator\">:</span> task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span>\n        title<span class=\"token operator\">:</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>elements<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span>\n        description<span class=\"token operator\">:</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>elements<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span>\n        urgency<span class=\"token operator\">:</span> urgencyLevel<span class=\"token punctuation\">,</span>\n        status<span class=\"token operator\">:</span> task<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">,</span>\n        isCollapsed<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token function\">addTask</span><span class=\"token punctuation\">(</span>newTask<span class=\"token punctuation\">)</span>\n      <span class=\"token function\">setCollapsed</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>formAction <span class=\"token operator\">===</span> <span class=\"token string\">\"delete\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">deleteTask</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>If our form action is set to save that means we are trying to either save a task or edit it. If we are trying to edit it we don’t want to actually submit a form - we just want to “uncollapse” it. If we are saving a task then we create a new object with the properties from the form and from the state. If we are trying to delete the task we just call our deleteTask function while passing in the task’s ID.</p>\n<p>To be able to move a task between status lanes I made two functions which are very similar in what they do, but this makes the code more readable.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">handleMoveLeft</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> newStatus <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">\"In Progress\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    newStatus <span class=\"token operator\">=</span> <span class=\"token string\">\"Backlog\"</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">\"Done\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    newStatus <span class=\"token operator\">=</span> <span class=\"token string\">\"In Progress\"</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>newStatus <span class=\"token operator\">!==</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">moveTask</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span> newStatus<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">handleMoveRight</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> newStatus <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">\"Backlog\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    newStatus <span class=\"token operator\">=</span> <span class=\"token string\">\"In Progress\"</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">\"In Progress\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    newStatus <span class=\"token operator\">=</span> <span class=\"token string\">\"Done\"</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>newStatus <span class=\"token operator\">!==</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">moveTask</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span> newStatus<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Both functions look at the task’s current status and set the new status based on what we are trying to do. Backlog is our left-most status so clicking the moveLeft button while the task is in the Backlog won’t do anything. Similar is true for the Done status and clicking the moveRight button.</p>\n<p>And that is all of the code I’ve used for this project, except for the CSS. If you are interested into seeing the full working version you can check out <a href=\"https://codesandbox.io/s/task-management-app-o5hcn\" target=\"_blank\" rel=\"noopener noreferrer\">the project on CodeSandbox</a>.</p>\n<hr>\n<div class=\"sectionHighlight\">If you have any questions or comments you can reach out to me on <a href=\"https://twitter.com/alekswritescode\" target=\"_blank\" rel=\"noopener noreferrer\">Twitter</a> and <a href=\"https://www.instagram.com/aleks.popovic/\" target=\"_blank\" rel=\"noopener noreferrer\">Instagram</a>, where I also post interesting code tidbits and designs.\n<p>I also have a <a href=\"https://www.youtube.com/AleksPopovic\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube channel</a> where I regularly upload React and web dev tutorials, so if that’s your cup of tea feel free to support me by subscribing.</div></p>","frontmatter":{"title":"Building a Task Management App in React","series":null,"seriesLink":null,"date":"December 12, 2020","description":"Can you become more productive by making a productivity app? Not sure about that, but you can definitely become more productive by building new projects and a task management app has been on my mind for a long time now. I decided to build it in React without using any additional plugins except node-sass which allows you to use .scss files in your project.","tags":["web","react"],"featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACJ0lEQVQozy2SbU+ScRSH+UZttrQCLQUUUwMh1xDNzEwcppIIAiJPIiqKSqLyIKI3EtyKCsOVvjA3N7e2vtPVn60X15uznev8zs5RNJ94eHbsoSnv4kne+Z95mk4WeF300ScH0Z36eXcZQWUb5ammF13gK321ZVSnizyXPLQUBFLD40bRIoSqopeByxiTV0nGrhLM1tMYpTDagg/TWRhLfRXDnovgxDgPqXXkVAz9kR9TMYQy5UaV8/CiEUygUBYW6ZB9OO4yyLdV5Mdf3Dze4yjt8jLvpl8OY6xGsGS9JB0z/M1u8SAlMaUDdGZFb8pDR0YgpK1HIqG67Ed7voS1tk20lmbvRiJ8dsCH4gqa4hL95QC6Hz6MeR+Sc5Zrt4M/uTj9OT/KfRdqMag960adEzSEXWd+9LUISxUv5fggye0RNjcsRKMWVqLDxJfN5NbM6ONzOO1TBLp17NutfJbidBx6aEu7RDo37UcLaBsrvzkPoJRDhHfGubO9oujo5tbZRX2ui4pDx66nj7LTwPBMGHXPKN/0b8lHQuyf3pC//8370iqth/OoxUG0kkjYcxGkXaw2KIpfEjamDueYztgx70zyccuKI7CI1eZlaH4DozXI1LSPUCzH2vE1m5k6oYsybScuNOIrNNICCkM1TE/Jz6ef6wyIa/ZWllGXgjQXvBhSCUzTCTrHwpjtMYYcm4y4v+Pfq7CSrTLhzxA8kOktR2k+dtIqpP8A4jaJ4Hdy4z4AAAAASUVORK5CYII=","aspectRatio":2.6666666666666665,"src":"/static/1312c0bcf30a703d64ed453a69a090d5/0e6e2/task.png","srcSet":"/static/1312c0bcf30a703d64ed453a69a090d5/b460a/task.png 480w,\n/static/1312c0bcf30a703d64ed453a69a090d5/6e898/task.png 960w,\n/static/1312c0bcf30a703d64ed453a69a090d5/0e6e2/task.png 1920w","srcWebp":"/static/1312c0bcf30a703d64ed453a69a090d5/30cf3/task.webp","srcSetWebp":"/static/1312c0bcf30a703d64ed453a69a090d5/35871/task.webp 480w,\n/static/1312c0bcf30a703d64ed453a69a090d5/fcc10/task.webp 960w,\n/static/1312c0bcf30a703d64ed453a69a090d5/30cf3/task.webp 1920w","sizes":"(max-width: 1920px) 100vw, 1920px"}}}}}},"pageContext":{"slug":"/Building-a-Task-Management-App-in-React/","previous":{"excerpt":"Pixel art games have been making a huge comeback in recent years, but this time not because we are limited by technology, but because pixel…","fields":{"slug":"/How-to-build-a-Pixel-Art-Drawing-App-in-React/"},"frontmatter":{"date":"December 05, 2020","title":"How to build a Pixel Art Drawing App in React","series":null,"description":"Pixel art games have been making a huge comeback in recent years, but this time not because we are limited by technology, but because pixel art is really great. Some game developers are adjusting their workflows to transform their end product into a pixel art game even though they might start with 3d modeling at first. Others go the usual way of drawing sprites in a Pixel Art Editor and that is exactly what we are going to build today. We will go over how to generate a dynamic pixel grid, how to set up a color picker, how to actually draw pixels and in the end how to export your finished pixel art into a png image.","tags":["web","react"],"featuredImage":{"id":"8c98e87e-4c0d-56d9-a288-41dc668e7a8f","publicURL":"/static/289cf244f4327c29c8bdd92f75c2f460/pixels.png","relativeDirectory":"How-to-build-a-Pixel-Art-Drawing-App-in-React","relativePath":"How-to-build-a-Pixel-Art-Drawing-App-in-React/pixels.png"}}},"next":{"excerpt":"Until a few days ago I had no idea voice control and speech recognition were such a big deal. I lost the link to it, but according to an…","fields":{"slug":"/Build-Voice-Navigation-with-React-and-Speech-Recognition/"},"frontmatter":{"date":"December 19, 2020","title":"Build Voice Navigation with React and Speech Recognition","series":null,"description":"Until a few days ago I had no idea voice control and speech recognition were such a big deal. I lost the link to it, but according to an article I read, a big percentage of population likes to talk into their phones and home assistants. Maybe I am getting old, since it looked like the age group that uses it the most is 16-24? I think that's great (using the tech, not me getting old). Not only does it promote even more accessibility on the web, but it also gives us a glimpse into a future where we are no longer slaves to our clumsy fingers. I personally make too many typing mistakes, both on PC and smartphone keyboards.","tags":["web","react"],"featuredImage":{"id":"85d90288-b834-5a78-89b5-92e68eb93caa","publicURL":"/static/a2244cabb7554fc37a4a2a8d6be10da4/voice.png","relativeDirectory":"Build-Voice-Navigation-with-React-and-Speech-Recognition","relativePath":"Build-Voice-Navigation-with-React-and-Speech-Recognition/voice.png"}}}}}}